﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using System.Text;
using Microsoft.Research.Kinect.Nui;

namespace Kinect_XNA
{
    class Kinect
    {
        public Texture2D kRGBVideo;
        public Runtime kSensor;
        private Game1 game;

        public Kinect(Game1 game)
        {
            this.game = game;
        }

        public bool setup(int kIndex = 0)//Nesta linha é criado um método que retorna um bool, e tem o kIndex com o valor padrão de "0",
        //o método verifica se o sensor Kinect indicado existe, onde kIndex é a identificação do sensor caso seja usado mais de um.
        {
            if (Runtime.Kinects.Count > kIndex)
            {
                kSensor = Runtime.Kinects[kIndex];
                kSensor.Initialize(RuntimeOptions.UseColor | RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking);
                //Aqui é definido com quais opções o sensor é inicializado, sendo que ao finalizar o aplicativo ele deverá ser descarregado, usando "Uninitialize();".
                kSensor.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);                
                kSensor.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(kSensor_VideoFrameReady);
                return true;
            }
            else
            {
                return false;
            }
        }

            void kSensor_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
            {
                PlanarImage p = e.ImageFrame.Image;

                Color[] color = new Color[p.Height * p.Width];
                kRGBVideo = new Texture2D(game.GraphicsDevice, p.Width, p.Height);

                int index = 0;
                for(int y = 0; y < p.Height; y++)
                {
                    for (int x = 0; x < p.Width; x++, index += 4)
                    {
                        color[y * p.Width + x] = new Color(p.Bits[index + 2], p.Bits[index + 1], p.Bits[index + 0]);
                    }
                }
                kRGBVideo.SetData(color);
            }
        }
    
}
